home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-08-30 | 18.4 KB | 711 lines | [TEXT/ALFA] |
- # New modes can be specified by appending to the following vars.
- # are no longer any procs such as 'setTextMode' etc.
-
- # 'mode' is nothing when we start up.
- set mode ""
-
- set whichInfo mode
-
- #================================================================================
- # The next two procs are called by Alpha to handle the mode flags popup menu.
- #================================================================================
-
- proc getModeValuesAlpha {} {
- global mode
- global ${mode}modeVars
- global allFlags
- global whichInfo
- set fvals {}
- set vvals {}
-
- if {$whichInfo == "mode"} {
- if {[info exists ${mode}modeVars]} {
- set vars [lsort [array names ${mode}modeVars]]
- foreach v $vars {
- if {[lsearch $allFlags $v] >= 0} {
- lappend fvals $v [set ${mode}modeVars($v)]
- } else {
- lappend vvals $v 0
- }
- }
- }
- return [concat $fvals {-} 0 $vvals {{(-} 0 "Change List…" 0 "Set Mode Menus…" 0 "Describe Mode" 0 {(-} 0 "(Mode Info" 0 "File Info" 0}]
- } else {
- getWinInfo blah
- lappend m "Mac" [expr {$blah(platform) == "mac"}]
- lappend m "UNIX" [expr {$blah(platform) == "unix"}]
- lappend m "IBM" [expr {$blah(platform) == "ibm"}] {(-} 0
- lappend m "MPW" [expr {$blah(state) == "mpw"}]
- lappend m "Think" [expr {$blah(state) == "think"}]
- lappend m "None" [expr {$blah(state) == "none"}] {(-} 0
- lappend m "Read Only" $blah(read-only) {(-} 0
- lappend m "Mode Info" 0 "(File Info" 0
- return $m
- }
- }
-
-
- proc setModeVarAlpha {var} {
- global mode allFlags modeVars modifiedModeVars
- global whichInfo
- global ${mode}modeVars
-
- if {$whichInfo == "file"} {
- set var [string tolower $var]
- switch $var {
- "unix" -
- "mac" -
- "ibm" { setWinInfo platform $var }
- "mpw" -
- "think" -
- "none" { setWinInfo state $var }
- "mode info" { set whichInfo mode }
- "read only" {
- getWinInfo b
- setWinInfo read-only [expr -1 * ($b(read-only) - 1)]}
- }
- return
- }
-
- if {$var == "Set Mode Menus…"} {
- setModeMenus
- } elseif {$var == "File Info"} {
- set whichInfo file
- } elseif {$var == "Mode Info"} {
- set whichInfo mode
- } elseif {$var == "Change List…"} {
- set mvars {}
- catch {set mvars [array names ${mode}modeVars]}
- set vars [listpick -l -L $mvars -p "Set mode vars for '$mode':" [lsort $modeVars]]
- if {![string length $vars]} return
-
- catch {unset ${mode}modeVars}
- foreach v $vars {
- global $v
- set ${mode}modeVars($v) [set $v]
- }
- } elseif {$var == "Describe Mode"} {
- describeMode
- } elseif {[lsearch $allFlags $var] >= 0} {
- global $var
- set ${mode}modeVars($var) [set $var [expr -1 * ([set ${mode}modeVars($var)] - 1)]]
- lappend modifiedModeVars [list $var ${mode}modeVars]
- } else {
- global $var
- set res [prompt "New value of '$var':" [set ${mode}modeVars($var)]]
- set ${mode}modeVars($var) $res
- set $var $res
- lappend modifiedModeVars [list $var ${mode}modeVars]
- }
- }
-
- #================================================================================
-
-
- # Suffixes used to initially determine mode for new window.
- set modeSuffixes { default { set winMode Text } }
-
-
- # The set of menus that the modes may choose to use.
- set allModeMenus { thinkMenu cwarrierMenu toolserverMenu
- latexMenu thinkRefMenu tclMenu perlMenu }
-
- set modeVars { elecLBrace elecRBrace electricSemi fillColumn funcExpr
- funcPar leftFillColumn optionIsMeta prefixString suffixString
- tabSize wordBreak wordBreakPreface wordWrap
- }
-
-
- # The dummy proc for a mode is called whenever we change to that mode,
- # so that the autoloading facility will load the correct file, if
- # necessary.
-
- # The list of modes.
- set modes {}
- set lastMode 0
-
- # Can be used to add new mode-specific flags and variables (see think.tcl for example).
- proc newModeVar {mode var val isFlag} {
- global ${mode}modeVars modeVars allFlags $var
-
- if {![info exists modeVars] || [lsearch $modeVars $var] < 0} {
- lappend modeVars $var
- }
- if {![info exists ${mode}modeVars($var)]} {
- set ${mode}modeVars($var) $val
- set $var $val
- }
- if {$isFlag && (![info exists allFlags] || ([lsearch $allFlags $var] < 0))} {
- lappend allFlags $var
- }
- }
-
- #================================================================================
- lappend modes C
- set dummyProc(C) dummyC
- set modeMenus(C) { thinkMenu cwarrierMenu thinkRefMenu }
- lappend modeSuffixes {*.h} { set winMode C }
- lappend modeSuffixes {*.c} { set winMode C }
- lappend modeSuffixes {*.r} { set winMode C }
- newModeVar C elecRBrace {1} 1
- newModeVar C prefixString {//} 0
- newModeVar C electricSemi {1} 1
- newModeVar C wordBreak {[a-zA-Z0-9_]+} 0
- newModeVar C elecLBrace {1} 1
- newModeVar C wordWrap {0} 1
- newModeVar C funcExpr {^[^ \t\(#\r/@].*\(.*\)$} 0
- newModeVar C wordBreakPreface {[^a-zA-Z0-9_]} 0
- newModeVar C optionIsMeta {1} 1
- newModeVar C electricTab {0} 1
-
- set cCommentRegexp {/\*(([^*]/)|[^*]|\r)*\*/}
- set cPreRegexp {^\#[\t ]*[a-z]*}
- set cKeyWords {
- void register short enum extern int for if while struct static long
- switch case char unsigned double float return else default goto
- }
- regModeKeywords -e {//} -b {/*} {*/} -c red -k blue C $cKeyWords
-
- #================================================================================
- lappend modes C++
- set dummyProc(C++) dummyC++
- set modeMenus(C++) { thinkMenu cwarrierMenu thinkRefMenu }
- lappend modeSuffixes {*.h} { set winMode C++ }
- lappend modeSuffixes {*.cc} { set winMode C++ }
- lappend modeSuffixes {*.cp} { set winMode C++ }
- lappend modeSuffixes {*.cpp} { set winMode C++ }
- lappend modeSuffixes {*.CPP} { set winMode C++ }
- lappend modeSuffixes {*.C} { set winMode C++ }
- newModeVar C++ elecRBrace {1} 1
- newModeVar C++ prefixString {//} 0
- newModeVar C++ electricSemi {1} 1
- newModeVar C++ wordBreak {[a-zA-Z0-9_]+} 0
- newModeVar C++ elecLBrace {1} 1
- newModeVar C++ wordWrap {0} 1
- newModeVar C++ funcExpr {^[^ \t\(#\r/@].*\(.*\)$} 0
- newModeVar C++ wordBreakPreface {[^a-zA-Z0-9_]} 0
- newModeVar C++ optionIsMeta {1} 1
- newModeVar C++ electricTab {1} 1
-
- regModeKeywords -e {//} -b {/*} {*/} -c red -k blue {C++} [concat {
- new delete class friend protected private public template } $cKeyWords]
- unset cKeyWords
-
- #================================================================================
- lappend modes Csh
- set dummyProc(Csh) dummyCsh
- set modeMenus(Csh) { tclMenu }
- lappend modeSuffixes {*tcl\ sh*} {set winMode Csh}
- newModeVar Csh wordBreak {(\$)?[a-zA-Z0-9_]+} 0
- newModeVar Csh wordWrap {0} 1
- newModeVar Csh wordBreakPreface {[^a-zA-Z0-9_\$]} 0
- newModeVar Csh optionIsMeta {1} 1
- regModeKeywords -m {«} Csh {}
-
- #================================================================================
- lappend modes Text
- set modeMenus(Text) { }
- newModeVar Text suffixString { <--} 0
- newModeVar Text prefixString {> } 0
- newModeVar Text fillColumn {75} 0
- newModeVar Text wordWrap {1} 1
- newModeVar Text optionIsMeta {1} 1
-
- #================================================================================
- # Updated Fortran mode definition:
- #
- # Changes are: * .fcm suffix triggers Fort mode (CM-5 fortran)
- # * .for suffix triggers Fort mode (old compilers)
- # * "entry" names are included in subroutine lists
- # * prefix sting is set correctly (initial 'c')
- # * FortMarkFile routine provided (funcExpr doesn't work anymore?)
- #
- # WTP 8/5/94
- #=============================================================================
- lappend modes Fort
- set modeMenus(Fort) { }
- lappend modeSuffixes {*.f} { set winMode Fort }
- lappend modeSuffixes {*.fcm} { set winMode Fort }
- lappend modeSuffixes {*.for} { set winMode Fort }
- lappend modeSuffixes {*.FOR} { set winMode Fort }
- set FortmodeVars(wordWrap) {0}
- set FortmodeVars(prefixString) {c}
- set FortmodeVars(sortedIsDefault) {0}
- set FortmodeVars(funcExpr) {^[ \t]*(subroutine|.*function|entry|SUBROUTINE|.*FUNCTION|ENTRY).*\(.*$}
- set FortmodeVars(optionIsMeta) {1}
-
- set FortKeywords {
- backspace block call character close common complex
- continue data dimension do double else elseif end enddo endfile endif entry
- equivalence external format function goto if implicit inquire integer
- intrinsic logical open parameter precision print program read return save
- stop real rewind subroutine then write
- }
-
- regModeKeywords -c red -k blue Fort $FortKeywords
- unset FortKeywords
-
- #=============================================================================
-
- proc FortMarkFile {} {
- set pat1 {^[^cC][ \tA-Za-z*0-9]+(subroutine|function|entry)[ \t]*([A-Za-z0-9_]+)}
- set end [maxPos]
- set pos 0
- set l {}
- while {![catch {search -f 1 -r 1 -m 0 -i 1 $pat1 $pos} mtch]} {
- regexp -nocase $pat1 [eval getText $mtch] allofit subtyp name
- set start [lindex $mtch 0]
- set end [nextLineStart $start]
- set pos $end
- set inds($name) [lineStart $start]
- }
-
- if {[info exists inds]} {
- foreach f [lsort [array names inds]] {
- set next [nextLineStart $inds($f)]
- setNamedMark $f $inds($f) $next $next
- }
- }
- }
-
- #=============================================================================
- lappend modes Tcl
- set dummyProc(Tcl) dummyTcl
- set modeMenus(Tcl) { tclMenu }
- lappend modeSuffixes {*.tcl} { set winMode Tcl }
- newModeVar Tcl prefixString {# } 0
- newModeVar Tcl wordWrap {0} 1
- newModeVar Tcl funcExpr {^proc *([+-a-zA-Z0-9]+)} 0
- newModeVar Tcl wordBreak {(\$)?[a-zA-Z0-9_]+} 0
- newModeVar Tcl wordBreakPreface {([^a-zA-Z0-9_\$]|.\$)} 0
- newModeVar Tcl optionIsMeta {1} 1
- newModeVar Tcl electricTab {1} 1
-
- set tclKeywords {
- then append array break case catch cd close concat continue elseif else eof
- error eval exec exit expr file flush foreach format for gets global glob
- history if incr info join lappend library lindex linsert list llength
- lrange lreplace lsearch lsort open pid proc puts pwd read regexp regsub
- rename return scancontext scan seek set source split string switch tell
- time trace unknown unset uplevel upvar while
- }
- regModeKeywords -e {#} -c red -k blue Tcl $tclKeywords
- unset tclKeywords
-
- #================================================================================
- lappend modes MPW
- set modeMenus(MPW) { }
- lappend modeSuffixes {*Toolserver\ *} { set winMode MPW }
-
- #================================================================================
- lappend modes Brws
- set modeMenus(Brws) { }
- set dummyProc(Brws) dummyBrws
- #================================================================================
- lappend modes Diff
- set modeMenus(Diff) { }
- #================================================================================
-
- proc buildFlagsVars {} {
- global allFlags allVars modeVars
-
- set fs {}
- foreach f [lsort $allFlags] {
- if {[lsearch $modeVars $f] < 0} {
- lappend fs $f
- }
- }
- menu -m -n flags -p editFlag $fs
- eval global $fs
- foreach f $fs {
- markMenuItem flags $f [set $f]
- }
-
- set fs {}
- foreach f [lsort $allVars] {
- if {[lsearch $modeVars $f] < 0} {
- lappend fs $f
- }
- }
- menu -m -n vars -p editVar $fs
- }
-
-
- proc saveVarValues {} {
- global modes HOME
- if {[askyesno "Save variables and values to \"$HOME:alphaFlags.tcl\"?"] == "yes"} {
- set lines {}
- foreach m $modes {
- global ${m}modeVars
-
- if {[info exists ${m}modeVars]} {
- foreach v [array names ${m}modeVars] {
- append lines "set ${m}modeVars($v)\t\t\{[set ${m}modeVars($v)]\}\r"
- }
- append lines "\r"
- }
- }
-
- append lines "\r\r"
- global allFlags allVars
- set vars [lsort [concat $allFlags $allVars]]
- eval global $vars
- foreach f $vars {
- append lines "set $f\t\t\{[set $f]\}\r"
- }
-
- set fd [open "$HOME:alphaFlags.tcl" "w"]
- puts $fd $lines
- close $fd
- message "New '$HOME:alphaFlags.tcl' written."
- }
- }
-
-
- #================================================================================
-
- proc setWinMode name {
- global winModes modeSuffixes
- set nm [file tail $name]
- if {[set first [string last " <" $nm]] >= 0} {
- set rname [string range $nm 0 [expr $first - 1]]
- } else {
- set rname $nm
- }
- case $rname in $modeSuffixes
- set winModes($name) $winMode
- }
-
-
-
- proc newMode mode {
- global winModes modeProcs
-
- set name [lindex [winNames -f] 0]
- changeMode $mode
- set winModes($name) $mode
- }
-
-
- proc deactivateHook name {
- }
-
- proc suspendHook name {
- global iconifyOnSwitch
- global suspIconed
- if {$iconifyOnSwitch} {
- set wins [winNames -f]
- foreach win $wins {
- if {![icon -f "$win" -q]} {
- set suspIconed($win) 1
- icon -f "$win" -t
- }
- }
- }
- }
-
- proc resumeHook name {
- global iconifyOnSwitch resumeRevert suspIconed
- if {$iconifyOnSwitch && [info exists suspIconed]} {
- set wins [winNames -f]
- foreach win [array names suspIconed] {
- icon -f "$win" -o
- }
- unset suspIconed
- }
- if {$resumeRevert} {
- set resumeRevert 0
- revert
- }
- }
-
-
-
- # Handles dynamically adding and deleting window names from menu.
- proc addWinName name {
- global winNameToNum winMenu winNumToName fullNames
-
- for {set i 0} {$i<100} {incr i} {
- if {[catch {set nm $winNumToName($i)} res] == "1"} {
- if {$fullNames != "0"} {
- set nm $name
- } else {
- regexp {[^:]*$} $name nm
- }
- if {$i < 10} {
- addMenuItem -m -l "/$i" $winMenu $nm
- } else {
- addMenuItem -m -l "" $winMenu $nm
- }
- set winNumToName($i) $name
- set winNameToNum($name) $i
- return
- }
- }
- }
-
- proc removeWinName name {
- global winNameToNum winNumToName fullNames winMenu
-
- set num $winNameToNum($name)
- unset winNumToName($num)
- unset winNameToNum($name)
- if {$fullNames == "1"} {
- deleteMenuItem -m $winMenu $name
- } else {
- regexp {[^:]*$} $name nm
- deleteMenuItem -m $winMenu $nm
- }
- }
-
-
- proc menuWin {menu name} {
- global winNameToNum
-
- set nms [array names winNameToNum]
- foreach nm $nms {
- if {[string match *$name $nm] == "1"} {
- bringToFront $name
- if [icon -q] { icon -f $name -o }
- return
- }
- }
- return "normal"
- }
-
-
-
- proc changeMode {newMode} {
- global lastMode modeMenus dummyProc mode
-
- catch {displayMode $newMode}
- set lastMode $mode
- set mode $newMode
- if {$lastMode == $mode} return
-
- global ${mode}modeVars
- if {[info exists ${mode}modeVars]} {
- foreach v [array names ${mode}modeVars] {
- global $v
- set $v [set ${mode}modeVars($v)]
- }
- }
-
- if {[info exists dummyProc($mode)]} { $dummyProc($mode) }
-
- if {[info exists modeMenus($lastMode)]} {
- foreach m $modeMenus($lastMode) {
- global $m
- catch {removeMenu [set $m]}
- }
- }
- if {[info exists modeMenus($mode)]} {
- foreach m $modeMenus($mode) {
- global $m
- catch {insertMenu [set $m]}
- }
- }
- }
-
-
- proc setModeMenus {} {
- global mode modeMenus allModeMenus
-
- set menus [listpick -p "Select permanent menus for mode '$mode':" -l -L $modeMenus($mode) [lsort $allModeMenus]]
- if {![llength $menus]} return
- set modeMenus($mode) $menus
- addUserLine "set modeMenus($mode) \{ $menus \}"
-
- foreach m $allModeMenus {
- global $m
- catch {removeMenu [set $m]}
- }
- foreach m $menus {
- global $m
- catch {insertMenu [set $m]}
- }
- }
-
-
- #=============================================================================
- # Hook procs recognized: "openHook", "closeHook", "activateHook", "deactivateHook",
- # "suspendHook", "saveasHook", "saveHook", and "resumeHook".
- #=============================================================================
-
- if {![info exists winActive]} {set winActive ""}
-
- # Event hooks - set specific modes when files opened.
- proc openHook name {
- global winModes winActive
- changeMode $winModes($name)
- if {$name == {*Toolserver shell*}} startMPW
- addWinName $name
- message ""
- }
-
-
-
- # full pathname
- proc saveHook name {
- global backup backExtension backDir mode
-
- if {($mode == "C") || ($mode == "C++")} {catch {modified}}
-
- if ($backup) {
- if {![string length [set dir $backDir]]} {
- set dir [file dirname $name]
- }
- if {![file exists $dir]} {
- if {[askyesno "Create backup dir '$dir'?"] == "yes"} {
- mkdir $dir
- }
- }
- catch {rm $dir:[file tail $name]$backExtension}
- catch {cp $name $dir:[file tail $name]$backExtension}
- }
- }
-
- # Clean up the mark stack.
- proc closeHook name {
- global markStack winModes winActive
-
- unset winModes($name)
- if [llength $markStack] {
- set markStack [removePat $markStack $name*]
- }
- removeWinName $name
-
- if {[set ind [lsearch $winActive $name]] >= 0} {
- set winActive [lreplace $winActive $ind $ind]
- }
- }
-
-
- proc saveasHook {oldName newName} {
- global winModes winActive
- removeWinName $oldName
- addWinName $newName
- setWinMode $newName
- changeMode $winModes($newName)
-
- if {[set ind [lsearch $winActive $oldName]] >= 0} {
- set winActive [lreplace $winActive $ind $ind]
- }
- set winActive [linsert $winActive 0 $newName]
- }
-
- if {![info exists actives]} {set actives 0}
-
- # and, install a new 'winActive' patch , to 'activateHook':
-
- proc activateHook name {
- global winModes winActive
- if {![info exists winModes($name)]} {
- setWinMode $name
- }
- changeMode $winModes($name)
-
- if {[set ind [lsearch $winActive $name]] == -1} {
- set winActive [linsert $winActive 0 $name]
- return
- }
- if {$ind >= 1} {
- set winActive [lreplace $winActive $ind $ind]
- set winActive [linsert $winActive 0 $name]
- }
-
- }
-
-
- proc dirtyHook {name dirty} {
- global winMenu
- markMenuItem $winMenu [file tail $name] $dirty "◊"
- }
-
-
- set modifiedVars {}
- set modifiedModeVars {}
-
- proc quitHook {} {
- global modifiedVars modifiedModeVars
-
- if {[llength $modifiedVars] || [llength $modifiedModeVars} {
- if {[askyesno "Save changed flags/vars?"] == "yes"} {
- foreach f $modifiedVars {
- global $f
- addUserLine "set $f \"[set $f]\""
- }
- foreach f $modifiedModeVars {
- set nm [lindex $f 0]
- set mode [lindex $f 1]
- global $mode
- addUserLine "set ${mode}($nm) \"[set $mode($nm)]\""
- }
- }
- }
- }
-
-
- #================================================================================
-
- proc describeMode {} {
- global mode modeSuffixes modeMenus modes
- global ${mode}modeVars
-
- set text "\r\tMODE $mode\r\r"
- set suffs ""
- set first 1
- foreach suf $modeSuffixes {
- if {([llength $suf] == 3) && ([lindex $suf 1] == "winMode") && ([lindex $suf 2] == $mode)} {
- if {$first} {
- lappend suffs $last
- set first 0
- } else {
- append suffs ", $last"
- }
- }
- set last $suf
- }
- append text "Mode suffixes: $suffs\r\r"
-
- set first 1
- append text "Mode menus: "
- if {[info exists modeMenus($mode)]} {
- foreach m $modeMenus($mode) {
- if $first {
- set first 0
- lappend text $m
- } else {
- append text ", $m"
- }
- }
- }
- append text "\r\r"
-
- append text "Mode-specific variables:\r"
- if {[info exists ${mode}modeVars]} {
- foreach v [lsort [array names ${mode}modeVars]] {
- append text [format "\t%-20s: \"%s\"\r" $v [set ${mode}modeVars($v)]]
- }
- }
-
-
- set etext "\rMode-independent bindings:\r"
- append text "\rMode-specific bindings:\r"
- foreach b [split [bindingList] "\r"] {
- set lst [lindex $b end]
- if {$lst == $mode} {
- append text "\t$b\r"
- } elseif {[lsearch $modes $lst] < 0} {
- append etext "\t$b\r"
- }
- }
- new
- insertText $text$etext
- goto 0
-
- setWinInfo dirty 0
- }
-
-
-